메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

OpenBSD의 IPFilter

한빛미디어

|

2001-08-27

|

by HANBIT

10,502

By 마이크 디그로-버치(Mike DeGraw-Bertsch), 역 한빛 리포터 2기 서광열 일단 무선 게이트웨이를 설정해 놓고 나면, 내부의 스크립트 키디† 가 네트워크에 침입하는 것을 원치 않을 것이다. 막 광대역 연결의 설정을 끝내고 내부 네트워크(LAN)을 보호하려 할 수도 있다. 혹은 컴퓨터의 몇 가지 포트만을 제외한 모든 접속을 차단하고 싶을 수도 있다. 여기에는 매우 비싼 Cisco PIX 방화벽부터 싸지만 안심할 수 없는 솔루션까지 다양한 방법이 있다. 비용을 절감하면서도 보안은 물론, 마음의 안정까지 가져다는 주는 타협점이 바로 OpenBSD의 IPFilter를 사용하는 것이다. († 스크립트 키디(script kiddies)는 네트워크를 휘젓고 다니는 크래커를 지칭한다. 실제로 컴퓨터에 대한 깊은 이해를 가진 것은 아니지만, 인터넷의 각종 해킹 도구를 가지고 무작위로 서버를 공격하는 가장 위험한 부류에 속한다.) IPFilter란 무엇인가? 간단히 말해서 몇 가지 기준에 의해서 IP 패킷을 통과시킬 것인지 아닐지를 결정하는 일련의 도구다. NAT(Network Address Translation) 기능을 사용할 수도 있다. IPFilter 웹사이트에 가면 보다 자세한 정보를 얻을 수 있다. 사용할 수 있는 패킷룰은 한 인터페이스의 모든 트래픽(traffic)을 차단하는 것과 같이 매우 간단한 것에서부터, 199.232.41.24/29 서브넷으로부터 fxp0 인터페이스에 들어오는 ICMP-QUERY 타입의 ICMP 트래픽을 통과시키고 이에 대한 로그를 남기라는 비교적 복잡한 것까지 다양하다. 각 패킷룰은 한 방향만을 제어할 수 있으므로, 사용자는 밖으로 나가는 패킷을 허용하면서도 안으로 들어오는 HTTP 패킷을 차단할 수 있게 된다. 두 개의 카드(인터페이스)를 브리지로 연결할 때, OpenBSD의 브리지 디바이스는 안쪽으로 들어오는 필터룰만을 검사한다. 쌍방향에 대한 패킷룰은 반대쪽 NIC에서 안으로 들어오는 패킷룰을 지정해 줌으로써 간단히 구현할 수 있다. 어떻게 시작할 것인가? 일단 OpenBSD를 운영체제로 쓰고 있는 머신을 마련한다. 어느 486 머신이든 관계없고 386 또한 가능하다. IPFilter 패키지는 2001년 5월 30일 소스 코드에서 삭제되었기 때문에 그 이전의 버전을 구해야 한다. 그러나 IPF는 OpenBSD 패킷 필터인 PF로 대체되었고, 이는 IPFilter와 문법적인 사용 방법에서 호환 가능하도록 설계되었기 때문에 이 문서 내용의 대부분은 PF에서도 여전히 유효하다. IPFilter가 OpenBSD에서는 제거되었지만 FreeBSD와 NetBSD에서는 여전히 사용되고 있다. 그리고 네트워크 카드가 두 개 필요하다. 하나의 네트워크 카드로는 안전한 방화벽이나 브리지를 만들 수 없다. 두 개 이상의 네트워크 카드를 사용할 수도 있다. 사용자의 요구에 맞게 재설정하면 되는 것이다. OpenBSD 커널을 만들 때, 설정 파일에 option IPFILTER를 추가하는 것을 잊지 말기 바란다. 실제 IP 패킷의 로그를 남기고 싶다면 option IPFILTER_LOG도 넣도록 한다. 이는 /dev/ipl 디바이스로부터 패킷의 로그를 남기는 유틸리티인 ipmon가 함께 사용하면 강력한 기능을 가지게 된다. OpenBSD를 사용하면 눈에 보이지 않는 브리지 방화벽을 만드는 것이 가능하다. 필터와 방화벽처럼 작동하지만 브리지를 통과하는 패킷의 TTL†† 을 감소시키는 않는다. 이는 외부 사용자들에게 보이지 않으므로, 결국 브리지는 네트워크 카드에 IP 주소를 가질 필요조차 없다. (†† TTL은 Time To Live의 약자로서의 IP Packet의 Route를 잃고 인터넷에서 지속적으로 라우팅되는 것을 방지하기 위해서, 라우터를 거쳐갈 수 있는 최대한의 숫자를 미리 지정하는 것이다. TTL는 한 번 라우팅될 때마다 1씩 감소하는데 이 값이 0에 이르게 되면 라우터는 ICMP Error Message를 돌려보내고 패킷을 버린다. 따라서 TTL을 감소시키지 않고 필터를 적용할 수 있다는 것은 외부에서는 필터의 존재 사실을 알 수 없게 만들어 준다.) 다음으로 /etc/rc.conf 파일을 고쳐서 ipfilter=yes라는 줄을 추가한다. NAT를 사용하려면 ipnat=YES를 함께 추가해 준다. NAT는 일반적으로 사용하지 않는 편이 좋은데, 다음은 NAT 기능을 빼고 만든 예제이다. 네트워크 카드는 IP 주소가 필요 없지만, 설정해 줄 수도 있다. 예를 들어, 두 개의 인텔 EtherExpress 카드(fxp0, fxp1)가 있다면, 설정 파일이 다음과 같을 것이다.

/etc/hostname.fxp0
inet 199.232.41.26 255.255.255.248

/etc/hostname.fxp1
media 10BaseT up
이제 두 개의 NIC 사이에 브리지를 설정해 보도록 하자. /etc/bridgename.bridge0 파일을 만들면 된다.

add fxp0 add fxp1 up 
이렇게 두 개의 디바이스를 이어주면, 외부에서 접근할 수 있는 투명한(transparent) 방화벽을 만들게 된다. 남는 모니터나 KVM 스위치가 없다면 이 기능이 매우 편리할 것이다. 이제 방화벽을 설정할 모든 준비가 되었다. 지금부터는 패킷룰과 옵션에 대해서 이야기하도록 하겠다. 룰 설정 기본적으로 방화벽의 룰 설정 파일은 /etc/ipf.rules에 들어가게 된다. /usr/share/ipf/examples/에는 많은 설정 예제 파일이 있다. 지금부터 /usr/share/ipf/examples/firewall.2 파일을 약간 수정한 버전을 한 줄씩 살펴볼 것이다. 수정된 부분은 보안 셸(SSH)을 이용해서 방화벽에 접속할 수 있게 만들어 주는데, 이 글의 후반부에서 다시 살펴볼 것이다.

pass out from any to any
pass in from any to any
IPFilter은 quick이라는 키워드가 지정되지 않은 이상 마지막으로 지정된 룰이 유효하다. 그러므로 두 개의 룰은 모든 패킷을 통과시키게 된다.

block in log quick on fxp0 proto icmp from any to any icmp-type redir
block in log quick on fxp0 proto tcp/udp all with short
block in log quick on fxp0 from any to any with ipopts
만약 ICMP 방향 재지정(redirect) 요청, 헤더를 살펴볼 수 없는 분할된(fragmented) 패킷, IP 옵션이 포함된 패킷이 인터넷에 연결된 fxp0 인터페이스에 들어오면 바로 패킷이 차단되고 로그가 남는다.

block in log quick on fxp0 from 199.232.41.24/29 to any
block in log quick on fxp0 from localhost to any
block in log quick on fxp0 from 0.0.0.0/32 to any
block in log quick on fxp0 from 255.255.255.255/32 to any
외부에서 방화벽으로 들어오는 패킷 중에 방화벽 뒷단이나 로컬호스트, 0.0.0.0, 255.255.255.255로 IP를 속이고 들어오는 패킷이 있다면, 이를 차단하고 로그를 남긴다.

block in log quick from 10.0.0.0/8 to any group 100
block in log quick from 192.168.0.0/16 to any group 100
block in log quick from 172.16.0.0/12 to any group 100
또한 예약된 IP 주소 블록에서 들어오는 패킷은 모두 차단해 준다.

block in log quick on fxp1 from any to 199.232.41.24/29
방화벽에서 내부 머신으로 접속하는 것을 막고, 그 반대로 내부 머신이 방화벽으로 접속하는 것 또한 차단한다. 이는 한 머신이 크랙당했을 때 교두보가 되는 것을 방지하고 스위치 허브의 경우 방화벽 뒷단에 있는 머신들이 서로 통신하는 것을 차단하지 않기 위해 필요하다.

block in on fxp0 proto udp from any to any
block in log on fxp0 proto udp from any to any port = sunrpc
block in log on fxp0 proto udp from any to any port = 2049
pass in on fxp0 proto udp from any to any port = domain
인터넷에서 들어오는 패킷 중에 DNS을 제외한 모든 UDP 패킷을 차단한다. UDP 트래픽이 NFS나 포트맵 요청이면 차단과 동시에 로그를 남긴다. 그리고 마지막 룰이 유효한 규칙에 따라, pass...domain 부분은 DNS 트래픽을 들어올 수 있게 허가해 준다.

block return-rst in log on fxp0 proto tcp from any to any flags S/SA
block return-rst in on fxp0 proto tcp from any to any port = auth flags S/SA
또한 TCP 셋업 요청이 들어오면 모두 잠그고 로그를 남겨야 한다. ident 요청은 너무 자주 들어오므로 차단은 해주되 로그는 남기지 않도록 한다.

pass in on fxp0 proto tcp from any to any port = domain
pass in on fxp0 proto tcp from any to 199.232.41.27 port = smtp
pass in on fxp0 proto tcp from any to 199.232.41.27 port = www
pass in on fxp0 proto tcp from any to 199.232.41.27 port = ssh
pass in on fxp0 proto tcp from any to 199.232.41.26 port = ssh
마지막으로 어떤 내부 머신으로 DNS 트래픽을 허가해 준다. 199.232.41.47로는 웹과 SMTP 트래픽을 열어주고 199.232.41.27199.232.41.26에는 보안 셸(SSH)을 열어준다. 요약 OpenBSD의 IPFilter는 간단하면서도 효과적인 방화벽을 제공한다. 하드웨어 요구 사항은 최소며, 낮은 비용으로 효과적인 보호가 가능하다. 룰셋은 읽고 쉽고 영어처럼 간편하다.
마이크 디그로-버치(Mike DeGraw-Bertcsh)는 오라일리 캠브리지(O"Reilly Cambridge)의 매니저이자 시스템 관리자로 일한다. 시스템을 다루거나 펄을 해킹하지 않을 때는, 아이스 하키를 즐긴다고 한다.
TAG :
댓글 입력
자료실

최근 본 책0